home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / complex / _iscopro.c next >
C/C++ Source or Header  |  2000-05-22  |  3KB  |  131 lines

  1. /*
  2.  * PROJECT C Library, X68000 PROGRAMMING INTERFACE DEFINITION
  3.  * --------------------------------------------------------------------
  4.  * This file is written by the Project C Library Group,  and completely
  5.  * in public domain. You can freely use, copy, modify, and redistribute
  6.  * the whole contents, without this notice.
  7.  * --------------------------------------------------------------------
  8.  * $Id: _iscopro.c,v 1.4 1993/11/13 06:33:30 mura Exp $
  9.  */
  10.  
  11. /* System headers */
  12. #include <interrupt.h>
  13. #include <sys/dos.h>
  14. #include <sys/iocs.h>
  15. #include <sys/xmath.h>
  16.  
  17. /*
  18. ** X68030 Human system work area (super visor)
  19. */
  20.  
  21. /* Macros */
  22. #define CPUTYPE() _iocs_b_bpeek ((void *) 0xcbc) /* CPU type */
  23. #define FPUFLAG() _iocs_b_bpeek ((void *) 0xcbd) /* FPU type */
  24. #define MMUFLAG() _iocs_b_bpeek ((void *) 0xcbe) /* MMU type */
  25.  
  26. /* External variables */
  27. char _havefpu = _FLG_ILCPU;
  28. char _ohavefpu = _FLG_ILCPU;
  29.  
  30. /* File scope variables */
  31. static volatile int privintr_flag;
  32.  
  33. /* File scope functions */
  34. static void privilege (void)
  35. {
  36.     /* 割り込みフラグを立てる */
  37.     privintr_flag = 0;
  38.  
  39.     /* RTE で戻る */
  40.     IRTE ();
  41. }
  42.  
  43. /* File scope functions */
  44. static int is_mpu68000 (void)
  45. {
  46.     int *old_vec;
  47.     unsigned short sr;
  48.  
  49.     /* フラグを初期化 */
  50.     privintr_flag = 1;
  51.  
  52.     /* 特権命令違反ベクタをフックする */
  53.     old_vec = _dos_intvcs (_PRIV_VECTORNO, (void *) privilege);
  54.  
  55.     /* 68010 ~ 680?0 の特権命令を実行する */
  56.     sr = 0;
  57.     asm volatile ("move.w sr,%0" : "=g" (sr));
  58.  
  59.     /* 特権命令違反ベクタを元に戻す */
  60.     _dos_intvcs (_PRIV_VECTORNO, old_vec);
  61.  
  62.     /* スーパーバイザーならエラー */
  63.     if (sr & (1 << 13))
  64.     return -1;
  65.  
  66.     /* 割り込みフラグを返す */
  67.     return privintr_flag;
  68. }
  69.  
  70. static int ioflag (int codechk)
  71. {
  72.     int result;
  73.     unsigned short buf;
  74.  
  75.     /* CPU の種類を調べる Human Version 2.00-2.03 互換用 */
  76.     result = codechk ? (is_mpu68000 () ? 0 : _FLG_ILCPU) : (_FLG_ILCPU);
  77.  
  78.     /* Co-Processor I/O がアクセス可能か FPU RESPONSE CIR(R) */
  79.     if(_dos_memcpy ((void *) _FPU_IO, &buf, 2) == 0) {
  80.  
  81.     /* I/O Co-Processor 初期化 */
  82.     _fpuinit();
  83.  
  84.     /* フラグセット */
  85.     result |= _FLG_IOFPU;
  86.  
  87.     }
  88.  
  89.     /* 結果を返す */
  90.     return result;
  91. }
  92.  
  93. /* Functions */
  94. char _iscopro (void)
  95. {
  96.     /* 内部情報で判定 */
  97.     switch (CPUTYPE ()) {
  98.  
  99.     case 0 : /* MC68000 (MC68000 - MC68020 (改)) */
  100.     _ohavefpu = ioflag (1);
  101.     break;
  102.  
  103.     case 1 : /* MC68010 */
  104.     _ohavefpu = ioflag (0);
  105.     break;
  106.  
  107.     case 2 : /* MC68020 */
  108.     case 3 : /* MC68030 */
  109.     case 4 : /* MC68040 */
  110.     case 6 : /* MC68060 */
  111.  
  112.     /* FPU なら _FLG_FPU, _FLG_ILCPU を設定 */
  113.     if (FPUFLAG () != 0)
  114.         _ohavefpu = _FLG_FPU | _FLG_ILCPU;
  115.  
  116.     /* FPU がないならエラー */
  117.     else
  118.         _ohavefpu = _FLG_ILCPU;
  119.  
  120.     break;
  121.  
  122.     default: /* それ以外 */
  123.     _ohavefpu = _FLG_ILCPU;
  124.     break;
  125.  
  126.     }
  127.  
  128.     /* 結果を返す */
  129.     return _ohavefpu;
  130. }
  131.